//  扩展类型  ===》 枚举

//（1）,枚举通常用于约束某个变量的取值范围
//    1,字面量存在的问题    
        //  ：在类型约束的位置，会产生重复的代码，可以使用类型别名解决该问题、
        //  ；逻辑名称和真实的值产生了混淆，会导致当修改真实值得时候，产生大量的修改    
        //  :字面量类型不会进入编译结果
 type Gender = "男"|"女"
 let gender:Gender

 gender = "男"
 gender = "女"

 function search(g:Gender) {

 }


 //---------如何定义枚举------------

 enum Sex {  //枚举
    //逻辑名称  真实值
    //key ： value
     male = '男',
     female = '女'
 }

 let people:Sex;
 people = Sex.female  //逻辑名称
 people = Sex.male

 //枚举会出现在编译结果中，表现为对象   ts运行代码就可以看到

function printSex() {
    let vals = Object.values(Sex)
    vals.forEach(item => console.log(item))
}
printSex()




//枚举的细节
    //枚举的字段的值，可以使用字符串或者数字   数字类型的枚举有自增的一个趋势   被数字枚举的变量，可以直接赋值为变量

    // enum Level {
    //     level1 = 1,
    //     level2 = 2
    // }

    // let l:Level = Level.level1


// 数字类型的枚举有自增1的一个趋势 ----------------------------
    // enum Level {
    //     level1 = 1,
    //     level2 = 4,
    //     level3
    // }

    // let l:Level = Level.level1
    // l = Level.level3
    // console.log(l)
    

    // enum Level {
    //     level1,
    //     level2
    // }

    // let l:Level = Level.level1
    // console.log(l)

    // 被数字枚举的变量，可以直接赋值为数字，不建议这么玩，因为使用的是真实数据，而不是逻辑名称 --------------------

    // enum Level {
    //     level1,
    //     level2
    // }

    // let l:Level = Level.level1
    // l = 2
    // console.log(l)


//数字枚举和字符串枚举的编译结果有差异,可以看编译结果


//最佳的实践
    //（1）不要在枚举中即出现字符串，又出现字符串
    //(2) 在使用时尽量使用枚举的名称，避免使用真实的值










